/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Bdd;

import Metier.Mariage;
import java.util.ArrayList;
import java.sql.*;

/**
 *
 * @author kazanova
 */
public class MariageRepository extends Repository {

    private VipRepository vipRepo;
    
    public MariageRepository() {
        vipRepo = new VipRepository();
    }

    public ArrayList<Mariage> loadAll() {
        System.out.println("Tentative de chargement de tous les mariages");
        ArrayList<Mariage> list = new ArrayList<Mariage>();
        try {
            openConnection();           
            ResultSet ensresul = stmt.executeQuery("SELECT Mariage.id,Vip_id,Vip_id2,date,lieu FROM Mariage,Date where Date.id=Mariage.Dat_id");
            ensresul.last();
            int nbResult = ensresul.getRow();
            ensresul.beforeFirst();
            System.out.println("Chargement des "+nbResult+" mariages trouvés...");
            ResultSet vip1Info = null;
            ResultSet vip2Info = null;
            while (ensresul.next()) {
                System.out.println("Chargement des vip mariage "+ensresul.getInt(1));
                stmtPr = dataBaseConnection.prepareStatement("select * from ViewVip where id=?");
                stmtPr.setInt(1, ensresul.getInt(2));
                vip1Info = stmtPr.executeQuery();
                stmtPr = dataBaseConnection.prepareStatement("select * from ViewVip where id=?");
                stmtPr.setInt(1, ensresul.getInt(3));
                vip2Info = stmtPr.executeQuery();
                if (!vip1Info.first() || !vip2Info.first()) {
                    System.out.println("Erreur : le mariage contient des Vip inexistant");
                    vip1Info.close();
                    vip2Info.close();
                    ensresul.close();
                    closeConnection();
                    return null;
                }
                System.out.println("Création des deux Vip à partir du mariage...");
                Metier.Vip vip2 = new Metier.Vip(vip2Info.getInt(1), vip2Info.getString(2), vip2Info.getString(3), vip2Info.getString(4), vip2Info.getString(5), vip2Info.getDate(6), vip2Info.getString(7), vip2Info.getString(8), vip2Info.getBoolean(9), vip2Info.getBoolean(10));
                Metier.Vip vip1 = new Metier.Vip(vip1Info.getInt(1), vip1Info.getString(2), vip1Info.getString(3), vip1Info.getString(4), vip1Info.getString(5), vip1Info.getDate(6), vip1Info.getString(7), vip1Info.getString(8), vip1Info.getBoolean(9), vip1Info.getBoolean(10));
                vip1Info.close();
                vip2Info.close();
                stmtPr.close();
                list.add(new Metier.Mariage(
                        ensresul.getInt(1), // id
                        vip1,
                        vip2,
                        ensresul.getDate(4),
                        ensresul.getString(5)));
            }
            ensresul.close();
            closeConnection();
        } catch (SQLException e) {
            closeConnection();
            System.err.println("Erreur recupération donnée" + e);
        }
        System.out.println("Fin chargement Mariage");
        return list;
    }

    public Object loadById(int id) {
        System.out.println("Tentative de recupération de la Mariage avec l'id " + id);
        ResultSet result = null;
        Metier.Mariage objResult;
        try {
            openConnection();
            result = stmt.executeQuery("SELECT * FROM ViewMariage where id='" + id + "'");
            Metier.Vip vip1 = vipRepo.loadById(result.getInt(2));
            Metier.Vip vip2 = vipRepo.loadById(result.getInt(3));
            if (vip1 == null || vip2 == null) {
                return null;
            }
            objResult = new Metier.Mariage(
                    result.getInt(1), // id
                    vip1,
                    vip2,
                    result.getDate(4),
                    result.getString(5));
            closeConnection();
        } catch (java.sql.SQLException e) {
            closeConnection();
            System.err.println("Probleme execution requete " + e);
            return null;
        }
        System.out.println("Recupération Nationalité ok (" + objResult + ")");
        return objResult;
    }

    public int isObjectExist(Object obj) {
        if (obj.getClass() != Mariage.class) {
            System.out.println("ERREUR ! L'objet envoyé à isObjectExist n'est pas un Mariage");
            return -1;
        }
        Mariage objMariage = (Mariage) obj;
        ResultSet result = null;
        int nbObject = 0, idObject = -1;
        System.out.println("Recherche existance de Mariage entre " + objMariage.getVip1() + " et " + objMariage.getVip2());
        try {
            openConnection();
            result = stmt.executeQuery("select Mariage.id from Mariage,Date where ((Vip_id='"+objMariage.getVip1().getId()+"' AND Vip_id2='"+objMariage.getVip2().getId()+"') OR (Vip_id='"+objMariage.getVip2().getId()+"' AND Vip_id2='"+objMariage.getVip1().getId()+"')) AND date='"+objMariage.getDate()+"' AND Mariage.Dat_id=Date.id");
            result.last();
            nbObject = result.getRow();
            result.first();
            if(nbObject!=0) {
                if (nbObject > 1) {
                    System.out.println("WARNING ! Plusieurs Mariage existe avec la même valeur");
                } else {
                    System.out.println("Mariage unique trouvée");
                }
                idObject = result.getInt(1);
                result.close();
                closeConnection();
                return idObject;
            }
            
        } catch (java.sql.SQLException e) {
            // Alerte probleme requete //
            System.err.println("Probleme execution requete " + e);
            closeConnection();
            return -1;
        }
        closeConnection();
        return -1;
    }

    public boolean isIdExist(int id) {
        ResultSet result = null;
        ArrayList<Integer> fina = new ArrayList<Integer>();
        System.out.println("Recherche existance de Mariage avec id=" + id);
        try {
            openConnection();
            result = stmt.executeQuery("select count(id) from Mariage where id='" + id + "'");
            System.out.println("Verification existance Mariage id=" + id);
            int count;
            while (result.next()) {
                count = result.getInt(1);
                fina.add(count);
            }
            closeConnection();
        } catch (java.sql.SQLException e) {
            closeConnection();
            System.err.println("Probleme execution requete " + e);
            return false;
        }
        // Si il existe un nombre de resultat different de 1 //
        if (fina.size() != 1) {
            // Erreur SQL plusieurs nationalite avec le même id //
            System.out.println("ERROR ! Plusieurs Mariage existe avec cet id");
            return true;
        }
        if (fina.get(0) != 0) {
            System.out.println("Mariage unique trouvée");
            return true;
        }
        return false;
    }

    public int insertObject(Object obj) {
        if (obj.getClass() != Mariage.class) {
            System.out.println("ERREUR ! L'objet envoyé à isObjectExist n'est pas un Mariage");
            return -1;
        }
        Mariage objMariage = (Mariage) obj;

        System.out.println("Tentative insertion de " + objMariage.toString());
        // Recherche de l'existance d'un objet Mariage //
        if (isObjectExist(obj) != -1) {
            System.out.println("L'objet \"" + objMariage.toString() + "\" existe déjà");
            return INSERT_ERROR_EXIST;
        } else {
            System.out.println("Aucun mariage n'existe");
        }
        ////////////////////////////////////////////////////////////
        // L'objet n'est pas déjà présent, insertion d'un nouveau //
        ////////////////////////////////////////////////////////////

        // GESTION DE LA DATE //
        
        DateRepository dateRepo = new DateRepository();
        // On créer une nouvelle date (uniquement si inexistante, cf DateRepository) //
        if (dateRepo.insertObject(objMariage.getDate())) {
            System.out.println("Insertion date ok");
        } else {
            System.out.println("Probleme insertion date");
            return -1;
        }
        // On récupère l'id de cette date //
        int idDate = dateRepo.isObjectExist(objMariage.getDate());
        
        // GESTION DU VIP //
        
        VipRepository vipRepo = new VipRepository();
        // On récupère l'id de vip1 //
        int idVip1 = vipRepo.isObjectExist(objMariage.getVip1());
        // On récupère l'id de vip2 //
        int idVip2 = vipRepo.isObjectExist(objMariage.getVip2());
        // Verification des id //
        if (idVip1 == (-1) || idVip2 == (-1)) {
            return INSERT_ERROR_VIP;
        }

        try {
            openConnection();
            String query = "insert into Mariage (Vip_id,Vip_id2,Dat_id,lieu) values('" + idVip1 + "','" + idVip2 + "','" + idDate + "','" + objMariage.getLieu() + "')";
            stmt.executeUpdate(query);
            System.out.println("Insertion Mariage OK");
            // Mise a jour des statuts des 2 vip //
            System.out.println("Mise a jour des status des Vip...");
            query = "update Vip set celib='0' where id='"+idVip1+"'";
            stmt.executeUpdate(query);
            query = "update Vip set celib='0' where id='"+idVip2+"'";
            stmt.executeUpdate(query);
            closeConnection();
            return INSERT_OK;
        } catch (Exception e) {
            /* Alerte probleme requete */
            closeConnection();
            System.err.println("Probleme execution requete " + e);
            return INSERT_ERROR_NET;
        }
    }
    
    public void deleteObject(Mariage objMariage) {
        if(isObjectExist(objMariage)!=-1) {
            try {
                openConnection();
                String query = "delete from Mariage where id='"+objMariage.getId()+"'";
                stmt.executeUpdate(query);
                System.out.println("Suppression Mariage OK");
                // Mise a jour des statuts des 2 vip //
                System.out.println("Mise a jour des status des Vip...");
                query = "update Vip set celib='1' where id='"+objMariage.getVip1().getId()+"'";
                stmt.executeUpdate(query);
                query = "update Vip set celib='1' where id='"+objMariage.getVip2().getId()+"'";
                stmt.executeUpdate(query);
                closeConnection();
            } catch (Exception e) {
                /* Alerte probleme requete */
                closeConnection();
                System.err.println("Probleme execution requete " + e);
            }
        }
        else {
            System.err.println("Aucun mariage trouvé dans la BD");
        }
    }
}
